home *** CD-ROM | disk | FTP | other *** search
/ Ultimate Screensaver / Ultimate Screen Savers Collection (CMS Distributing) (1996).ISO / saver3 / xwsave1 / wxfake.c < prev    next >
C/C++ Source or Header  |  1995-03-01  |  6KB  |  219 lines

  1. /* //////////////////////////////////////////////////////////////////////
  2.  
  3.   Module:   Xfake.c - Provides a Microsoft Windows emulation of a group
  4.                       of X11 graphics functions.  These are used in
  5.                       porting X11 programs to MS Windows.
  6.  
  7.   Author:   Perry K. Sloope
  8.  
  9.   Copyright (c) 1995 Perry K. Sloope
  10.  
  11.   Permission to use, copy, modify, and distribute this software and its
  12.   documentation for any purpose and without fee is hereby granted,
  13.   provided that the above copyright notice appear in all copies and that
  14.   both that copyright notice and this permission notice appear in
  15.   supporting documentation.
  16.  
  17.   This file is provided AS IS with no warranties of any kind.  The author
  18.   shall have no liability with respect to the infringement of copyrights,
  19.   trade secrets or any patents by this file or any part thereof.  In no
  20.   event will the author be liable for any lost revenue or profits or
  21.   other special, indirect and consequential damages.
  22.  
  23.   Comments and additions should be sent to the author:
  24.  
  25.               sloope@blkbox.com  or
  26.               Compuserve 71234,3632
  27.  
  28.   These represent a subset of the X11 graphics commands.  Since I am not
  29.   currently an X windows or MS windows graphics expert, the output of
  30.   these functions may not exactly match those of the actual X11 functions.
  31.   In fact, some of these functions do nothing, they just were provided as
  32.   placebos for portability.
  33.  
  34.   These are unlikely to be the most efficent implmentation of MS windows
  35.   functions. I welcome any comments on this work.
  36.  
  37. //////////////////////////////////////////////////////////////////////  */
  38.  
  39. #ifdef _WIN32
  40. #define STRICK
  41. #endif
  42. #include <windows.h>
  43. #include "wXfake.h"
  44.  
  45.  
  46. // This function will only work correctly for full screen windows.
  47. // Use GetClientRect to get proper behavior for bordered windows.
  48. // Also see XClearWindow.
  49.  
  50. void XGetWindowAttributes(Display *dsp, Window win, XWindowAttributes *xwa)
  51. {
  52.    RECT r;
  53. //   GetClientRect(win.hWnd,&r);
  54.    GetWindowRect(win.hWnd,&r);
  55.    xwa->height = r.bottom + 1;
  56.    xwa->width  = r.right + 1;
  57. }
  58.  
  59.  
  60. Screen  *ScreenOfDisplay(Display *dsp, int screen)
  61. {
  62.     return (NULL);
  63. }
  64.  
  65.  
  66. Colormap DefaultColormapOfScreen(Screen *scr)
  67. {
  68.     return (NULL);
  69. }
  70.  
  71.  
  72. GC XCreateGC(Display *dsp, Window win, long GCForegrnd, XGCValues *xgcv)
  73. {
  74.     GC tmp = (GC)malloc(sizeof(_XGC));
  75.     if (!tmp)
  76.     {
  77. //        closegraph();
  78.         printf("Out of memory\n");
  79.         exit(1);
  80.     }
  81.     tmp->fgcolor = xgcv->foreground;
  82.     return (tmp);
  83. }
  84.  
  85.  
  86. void XSetForeground(Display *dsp, GC gc, long color)
  87. {
  88.    // setcolor(color);
  89.     gc->fgcolor = color;
  90. }
  91.  
  92.  
  93. // MS Windows uses the current pen to draw the outline of a rectangle, so here
  94. // we have to set the pen and brush to the same color.  We could have set
  95. // the pen to default to the background color in main(), but then the little
  96. // rectangles would be invisible since they consist only of what the pen
  97. // draws.
  98. void XFillRectangle(Display *dsp, Window win, GC gc, int x1, int y1,
  99.                     int width, int height)
  100. {
  101.      HBRUSH hBrush;
  102.      HPEN hpen;
  103.  
  104.      hBrush = SelectObject(win.hdc, CreateSolidBrush(gc->fgcolor));
  105.      hpen = SelectObject(win.hdc, CreatePen(PS_INSIDEFRAME,0,gc->fgcolor));
  106.      Rectangle (win.hdc, x1,y1,x1+width,y1+height);
  107.      DeleteObject(SelectObject(win.hdc,hBrush));
  108.      DeleteObject(SelectObject(win.hdc,hpen));
  109. }
  110.  
  111.  
  112. void XFillRectangles(Display *dsp, Window win, GC gc,
  113.                      XRectangle rect[], int nrect)
  114. {
  115.     HBRUSH hBrush;
  116.     HPEN hpen;
  117.     int i;
  118.  
  119.     hBrush = SelectObject(win.hdc, CreateSolidBrush (gc->fgcolor));
  120.     hpen = SelectObject(win.hdc, CreatePen(PS_INSIDEFRAME,0,gc->fgcolor));
  121.     for (i = 0; i < nrect; i++)
  122.     {
  123.         Rectangle (win.hdc, rect[i].x, rect[i].y, rect[i].x+rect[i].width, rect[i].y+rect[i].height);
  124.     }
  125.     DeleteObject(SelectObject (win.hdc,hBrush));
  126.     DeleteObject(SelectObject(win.hdc,hpen));
  127. }
  128.  
  129.  
  130. int BlackPixel(Display *dsp, int screen)
  131. {
  132.     return(0);
  133. }
  134.  
  135.  
  136. // This function will only work correctly for full screen windows.
  137. // Use GetClientRect to get proper behavior for bordered windows.
  138. // Also see XGetWindowAttributes().
  139.  
  140. void XClearWindow(Display *dsp, Window win)
  141. {
  142.     RECT rc;
  143. //    GetClientRect(win.hWnd, &rc);
  144.     GetWindowRect(win.hWnd, &rc);
  145.     FillRect(win.hdc, &rc, (HBRUSH)win.hbrBackground);  // GetStockObject(BLACK_BRUSH));
  146. }
  147.  
  148.  
  149. void XClearArea(Display *dsp, Window win, int x, int y, int width,
  150.                 int height, int expose)
  151. {
  152.    _XGC gc;
  153.  
  154.    gc.fgcolor = GetBkColor(win.hdc);
  155.    XFillRectangle(dsp, win, &gc, x,y,width, height);
  156. }
  157.  
  158.  
  159. void XDrawPoints(Display *dsp, Window win, GC gc, XPoint Xpoints[], int nstars,
  160.                  int CrdModeOrigin)
  161. {
  162.     int i;
  163.  
  164.     for (i = 0; i < nstars; i++)
  165.          SetPixel(win.hdc,Xpoints[i].x,Xpoints[i].y, gc->fgcolor);
  166. }
  167.  
  168.  
  169. void XDrawPoint(Display *dsp, Window win,  GC gc, int x, int y)
  170. {
  171.     SetPixel(win.hdc,x, y, gc->fgcolor);
  172. }
  173.  
  174.  
  175.  
  176. void XDrawLine(Display *dsp, Window win, GC gc, int x1, int y1, int x2, int y2)
  177. {
  178.    HPEN hpen;
  179.  
  180.    hpen = SelectObject(win.hdc, CreatePen(PS_SOLID,0,gc->fgcolor));
  181.    MoveToEx(win.hdc,x1,y1,NULL);
  182.    LineTo(win.hdc,x2, y2);
  183.    DeleteObject(SelectObject(win.hdc,hpen));
  184. }
  185.  
  186. void XDrawSegments(Display *dsp, Window win, GC gc, XSegment *s, int numsegs)
  187. {
  188.    int i;
  189.    HPEN hpen;
  190.    hpen = SelectObject(win.hdc, CreatePen(PS_SOLID,0,gc->fgcolor));
  191.    for (i = 0; i < numsegs; i++)
  192.    {
  193.       MoveToEx(win.hdc,s[i].x1,s[i].y1,NULL);
  194.       LineTo(win.hdc,s[i].x2, s[i].y2);
  195.    }
  196.    DeleteObject(SelectObject(win.hdc,hpen));
  197. }
  198.  
  199. /* Not X functions, but needed for the screensavers. */
  200.  
  201. void bzero ( char arr[], long size)
  202. {
  203.     long i;
  204.  
  205.     for( i = 0; i < size; i++)
  206.        arr[i] = NULL;
  207. }
  208.  
  209. double rint (double num)
  210. {
  211.     double r, n;
  212.  
  213.     r = modf(num, &n);
  214.     if (r >= 0.5)
  215.       return n + 1;
  216.     else
  217.       return n;
  218. }
  219.